在上一篇文章中,我們學習了如何使用Django Rest Framework(DRF)來創建一個API應用。通過定義模型、序列化器和視圖,並通過JWT進行身份驗證:
[DAY4] Django與Docker Compose後端開發實戰 - 創建一個基於Django-Rest-Framework的應用
本篇文章中,我們將探討在Django項目中修改資料庫的正確作法,包括如何進行數據庫遷移和倒退以及探索MariaDB資料庫內部的一些資訊和使用方法。
假設我們需要從UserProfile
模型中去除permission_level
欄位,首先需要在account/models.py
中進行修改:
from django.contrib.auth.models import AbstractUser
from django.db import models
class UserProfile(AbstractUser):
pass
接下來,更新account/serializers.py
文件,移除permission_level
欄位:
from django.contrib.auth import get_user_model
from rest_framework import serializers
from django.contrib.auth.hashers import make_password
User = get_user_model()
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'email', 'password')
extra_kwargs = {
'password': {'write_only': True, 'required': True}
}
def create(self, validated_data):
validated_data['password'] = make_password(validated_data.get('password'))
return super(UserSerializer, self).create(validated_data)
更新模型後,需要進行數據庫遷移以應用變更:
docker exec -it backend-api-services python manage.py makemigrations
docker exec -it backend-api-services python manage.py migrate
如果我們需要倒退數據庫版本,例如從遷移0003
回退到0002
,可以使用以下命令:
docker exec -it backend-api-services python manage.py migrate account 0002
然後手動刪除0003
遷移文件並重啟容器:
docker-compose -f docker-compose-local.yml restart
如果需要撤銷應用的所有遷移,可以使用以下命令:
docker exec -it backend-api-services python manage.py migrate account zero
這些步驟確保了數據庫結構的變更與代碼保持一致,避免數據庫狀態與應用邏輯不匹配的問題。
在之前的教學中,我們將Django的預設數據庫從SQLite更改為MariaDB,這提供了一個穩定且可擴充的數據存儲方案,特別適合生產環境和大規模應用。MariaDB比SQLite更適合處理大量的同時連接和複雜的查詢,能夠更好地支持高併發和大數據量操作。
數據通常會存儲在容器的卷中,以我們的例子來說,數據存儲在backend-mariadb
這個容器的卷中:
volumes:
- mariadb_data:/var/lib/mysql
可以通過進入mariadb
容器內部來使用MySQL命令行工具訪問數據庫:
docker exec -it backend-mariadb bash
mysql -u root -p
輸入在yml
文件中定義的MYSQL_ROOT_PASSWORD
後,可以使用SQL語法來檢視數據庫和進行操作:
SHOW DATABASES; # 查看所有數據庫
USE your_database_name; # 選擇某數據庫
SHOW TABLES; # 顯示當前數據庫的所有表
SELECT * FROM your_table_name; # 查看表的數據
但是要注意,不建議在容器內部進行數據更改,應在Django中進行更改後進行遷移,以保持應用狀態和數據庫的一致性。
進入數據庫後,可以看到如下數據庫:
+--------------------+
| Database |
+--------------------+
| information_schema |
| mydatabase |
| mysql |
| performance_schema |
+--------------------+
這些數據庫的用途如下:
information_schema
:一個包含所有其他數據庫元數據的數據庫,讓我們可以查詢它來獲得關於數據庫實例的信息。mysql
:運行MariaDB必須的數據,如用戶帳戶信息和權限等。performance_schema
:適用於監控MariaDB性能和收集數據庫伺服器性能參數的數據庫。當我們進入自定義的mydatabase
時,可以使用以下命令來查看數據庫中的表:
SHOW TABLES;
顯示的表可能如下所示:
+--------------------------------------+
| Tables_in_mydatabase |
+--------------------------------------+
| account_userprofile |
| account_userprofile_groups |
| account_userprofile_user_permissions |
| auth_group |
| auth_group_permissions |
| auth_permission |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
| hello_hellomodel |
+--------------------------------------+
這些表中,auth
和django
開頭的表是Django自帶的系統表,用於支持各種框架級別的功能如用戶認證、權限管理、會話管理等。
account_userprofile
:存儲用戶資料的主要表。account_userprofile_groups
:用戶和組之間的多對多關係表。account_userprofile_user_permissions
:用戶和權限之間的多對多關係表。auth_group
:存儲用戶組的表。auth_group_permissions
:組和權限之間的多對多關係表。auth_permission
:存儲權限的表。django_admin_log
:Django管理日誌表。django_content_type
:Django內容類型表,用於通過內容類型框架提供泛型關聯。django_migrations
:Django遷移歷史表。django_session
:存儲會話數據的表。hello_hellomodel
:我們在hello
應用中定義的模型表。如果需要重新建立資料庫的數據,可以刪除相應的卷並重新建構容器。首先,查看mariadb的容器名稱或ID:
docker ps
確定容器名稱是backend-mariadb
後,查看其相關資訊:
docker inspect backend-mariadb
可以看到有一個Mounts
部分,顯示卷的名稱,例如template_mariadb_data
。然後停止容器並刪除該卷:
docker-compose down
docker volume rm template_mariadb_data
重新啟動並建構容器:
docker-compose -f docker-compose-local.yml up --build -d
在這篇文章中,我們學習了如何在Django項目中正確地修改資料庫結構,並探討了MariaDB的使用方法。通過進行數據庫遷移和版本回退,我們能夠保持數據庫結構與應用邏輯的一致性。同時,通過使用MariaDB,我們可以更好地支持大規模應用和高併發操作。在下一篇文章中將教會讀者如何建立管理員系統和Swagger API文檔!